home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / nfs.idb / usr / etc / boot / clinst.z / clinst
Text File  |  1992-04-03  |  17KB  |  820 lines

  1. #! /bin/sh
  2. #
  3. #
  4. HOSTNAME="`hostname`"
  5. #
  6. # Following variables should be read from file /usr/etc/boot/$CLASS.dat
  7. #
  8. #DISKLESS="/usr/tmp"
  9. #CLROOT="$DISKLESS/$HOST"
  10. #SHAREHOST="$HOSTNAME"
  11. #SHARE="$DISKLESS/$CLASS"
  12. #SWAP="$DISKLESS/swap/$HOST"
  13. #SWAPSIZE="10m"
  14. #GFXBOARD="ECLIPSE"
  15. #CPUBOARD="IP6"
  16. #MACH="IP6"
  17. #BOOTP_DIR="/usr/local/boot"
  18. #NIS="yes"
  19. #DLMAJOR=18
  20. #
  21. SHELL="/bin/sh"
  22. MKFILE="/etc/mkfile"
  23. DIR="/usr/etc/boot"
  24. NIS_DIR="/usr/etc/yp"
  25. INST="/usr/sbin/inst"
  26. SGI_CC=-cckr
  27. export SGI_CC
  28.  
  29. #
  30. #
  31.  
  32. CMDNAME=$0
  33. TARGET=""
  34.  
  35. #
  36. # CMDMODE is used to talk with cl_init
  37. #
  38. CMDMODE="no"
  39. MINUSR=""
  40.  
  41. SENDCLASS="\${CLASS}"
  42. SENDHOST="\${HOST}"
  43. NOWECHO="\${ECHO}"
  44.  
  45. #
  46. # Check the SHARE-directory is server's root.
  47. #
  48. #    Arguments: 1 -- SHARE directory
  49. #
  50. chk_sroot()
  51. {
  52.     if [ "$1" = "/" ]; then
  53.         return 1;
  54.     fi;
  55.  
  56.     set `ls -l "$1"`;
  57.  
  58.     if [ "$1" != "l---------" ]; then
  59.         return 0;
  60.     fi;
  61.  
  62.     if [ $# -ne 11 ]; then
  63.         echo "INTERNAL ERROR"
  64.         exit 99;
  65.     fi;
  66.  
  67.     shift; shift;
  68.     if [ $9 != "/" ]; then
  69.         return 0;
  70.     fi;
  71.  
  72.     return 1;
  73. }
  74.  
  75. #
  76. # Update exports on server
  77. #
  78. #    arguments: 1 -- export directory.
  79. #           2 -- r/w option.
  80. #           3 -- class/client KEY.
  81. #           4 -- access right(client only).
  82. #
  83. export_dir()
  84. {
  85.     if [ ! -f /etc/exports ]; then
  86.         > /etc/exports
  87.         chmod 644 /etc/exports
  88.     fi
  89.     grep $1 /etc/exports >/dev/null 2>&1
  90.     case $? in
  91.     1)
  92.         if [ "$4" = "" ]; then
  93.             echo "$1 -$2,anon=root    #class=$3" \
  94.                 >> /etc/exports
  95.         else
  96.             echo "$1 -$2,anon=root,access=$4    #host=$3" \
  97.                 >> /etc/exports
  98.         fi;;
  99.     esac
  100.  
  101.     if [ -x /usr/etc/exportfs ]; then
  102.         /usr/etc/exportfs -a
  103.         case $? in
  104.         0)
  105.             ;;
  106.         *)
  107.             echo "ATTENTION: fix /etc/exports and rerun exportfs !" >> /dev/console
  108.             exit 1
  109.             ;;
  110.         esac
  111.     else
  112.         echo "ATTENTION: /usr/etc/exportfs does not exist !" >> /dev/console
  113.         exit 1
  114.     fi
  115. }
  116.  
  117.  
  118. #
  119. #    Unexports directories on server.
  120. #
  121. #
  122. #        Arguments: 1 -- root directory
  123. #               2 -- key
  124. #               3 -- swap dir(client only)
  125. #
  126. unexport_dir()
  127. {
  128.     if [ ! -f /etc/exports ]; then
  129.         echo "ATTENTION: /usr/etc/exportfs does not exist !" >> /dev/console
  130.         exit 1
  131.     fi;
  132.  
  133.     /usr/etc/exportfs -u "$1"
  134.     if [ "$3" = "" ]; then
  135.         sed -e /\#class=$2/d /etc/exports > /etc/export.$$
  136.     else
  137.         /usr/etc/exportfs -u "$3"
  138.         sed -e /\#host=$2/d /etc/exports > /etc/export.$$
  139.         rm -r $3
  140.     fi;
  141.  
  142.     rm -r $1
  143.     mv /etc/export.$$ /etc/exports
  144. }
  145.  
  146.  
  147. #
  148. #    poke_host
  149. #
  150. #        Argument: 1 -- hostname.
  151. #              2 -- NIS option.
  152. #              3 -- TARGET.
  153. #
  154. #        return:   0 -- host is neither CLASS not CLIENT.
  155. #              1 -- host is not running.
  156. #              2 -- host in running.
  157. #
  158. poke_host()
  159. {
  160.     POKEHOST="$1";
  161.     POKENIS="$2";
  162.     POKETARGET="$3";
  163.  
  164.     RETVAL=0;
  165.     if [ "$POKENIS" = "yes" ]; then
  166.         ypmatch "$POKEHOST" bootparams > /dev/null 2>&1;
  167.         if [ $? -eq 0 ]; then
  168.             RETVAL=1;
  169.         fi;
  170.     fi;
  171.     if [ "$POKENIS" != "yes" -o "$RETVAL" -eq 0 ]; then
  172.         if [ ! -f /etc/bootparams ]; then
  173.             return 0;
  174.         fi
  175.         grep "$POKEHOST" /etc/bootparams | while read a_line; do
  176.             set $a_line;
  177.             if [ "$1" = "$POKEHOST" ]; then
  178.                 return 1;
  179.             fi;
  180.         done
  181.  
  182.         RETVAL=$?;
  183.     fi;
  184.  
  185.     if [ "$POKETARGET" = "share" -o "$RETVAL" -eq 0 ]; then
  186.         return "$RETVAL";
  187.     fi
  188.  
  189.     if [ `ping -s 56 -c 5 $POKEHOST | wc -l` -gt 6 ]; then
  190.         RETVAL=2;
  191.     fi
  192.  
  193.     return "$RETVAL";
  194. }
  195.  
  196. #
  197. #    poke_class
  198. #
  199. #        Argument: 1 -- share tree.
  200. #              2 -- NIS option.
  201. #              3 -- ACTION.
  202. #              4 -- CLASS.
  203. #
  204. #        return:   0 -- continue
  205. #              1 -- abort.
  206. #
  207. poke_class()
  208. {
  209.     POKESHARE="$1";
  210.     POKENIS="$2";
  211.     POKEACT="$3";
  212.     POKECLASS="$4";
  213.  
  214.     if [ "$POKENIS" = "yes" ]; then
  215.         ypcat bootparams | grep "share=${POKESHARE}" 2>&1 > /dev/null
  216.         if [ $? -eq 0 ]; then
  217.         echo "\nWARNING: Class $POKECLASS is still serving clients."
  218.         if [ "$POKEACT" = "delete" ]; then
  219.             echo "continue to delete $POKECLASS(Y/N)\07?\c"
  220.         else
  221.             echo "continue to update $POKECLASS(Y/N)\07?\c"
  222.         fi;
  223.         read CONF
  224.         if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  225.             return 1;
  226.         fi;
  227.         echo "\nChecking clients status:\n"
  228.         ypcat -k bootparams | grep "share=${POKESHARE}" | while read a_line; do
  229.             set $a_line;
  230.             echo "        $1 ... \c"
  231.             if [ `ping -s 56 -c 5 $1 | wc -l` -gt 6 ]; then
  232.                 echo "UP";
  233.             else
  234.                 echo "DOWN";
  235.             fi
  236.         done
  237.  
  238.         echo "\nWARNING: clients will be out of sync. Clients which are UP may crash.\n"
  239.         return 0;
  240.         fi;
  241.     fi;
  242.  
  243.     if [ ! -f /etc/bootparams ]; then
  244.         if [ "$POKEACT" = "delete" ]; then
  245.             return 1;
  246.         else
  247.             return 0;
  248.         fi;
  249.     fi
  250.  
  251.     grep "share=${POKESHARE}" /etc/bootparams 2>&1 > /dev/null
  252.     if [ $? -ne 0 ]; then
  253.         return 0;
  254.     fi
  255.  
  256.     echo "\nWARNING: Class $POKECLASS is still serving clients."
  257.     if [ "$POKEACT" = "delete" ]; then
  258.         echo "continue to delete $POKECLASS(Y/N)\07?\c"
  259.     else
  260.         echo "continue to update $POKECLASS(Y/N)\07?\c"
  261.     fi;
  262.     read CONF
  263.     if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  264.         return 1;
  265.     fi;
  266.     echo "\nChecking clients status:\n"
  267.     grep "share=${POKESHARE}" /etc/bootparams | while read a_line; do
  268.         set $a_line;
  269.         echo "    client $1 ... \c"
  270.         if [ `ping -s 56 -c 5 $1 | wc -l` -gt 6 ]; then
  271.             echo "UP";
  272.         else
  273.             echo "DOWN";
  274.         fi
  275.     done
  276.  
  277.     echo "\nWARNING: clients will be out of sync. Clients which are UP may crash.\n"
  278.     return 0;
  279.  
  280. }
  281. ACTION="create"
  282.  
  283. while [ "$1" != "" ]; do
  284.     case "$1" in
  285.     "-c")
  286.         shift
  287.         CLASS=$1
  288.         ;;
  289.     "-h")
  290.         shift
  291.         HOST=$1;
  292.         ;;
  293.     "-r")
  294.         CMDMODE="yes";
  295.         MINUSR="-R";
  296.         break;
  297.         ;;
  298.     "share")
  299.         TARGET="share";
  300.         ;;
  301.     "client")
  302.         TARGET="client";
  303.         ;;
  304.     "-d")
  305.         ACTION="delete"
  306.         ;;
  307.     *)
  308.         echo "$CMDNAME: [-h host] -c class [-d] share|client"
  309.         echo "    -h host:    create client tree for 'host', not needed for 'share'"
  310.         echo "    -c class:    use class 'class'"
  311.         echo "    -d:        delete the host or class"
  312.         echo "    share:        install prototype/share tree"
  313.         echo "    client:        install client tree"
  314.         exit 0
  315.         ;;
  316.     esac
  317.     shift;
  318. done
  319.  
  320. #
  321. # If class not supplied, it is assumed to be auto-installation.
  322. # The bizarre echo strings should not be modified, it is used in cl_init
  323. #
  324. if [ "$CMDMODE" = "yes" ]; then
  325.     echo "$SENDCLASS"
  326.     read CLASS
  327.  
  328.     if [ ! -f $DIR/$CLASS.dat ]; then
  329.         echo "missing class file"
  330.         exit 0;
  331.     fi;
  332.  
  333.     echo "$SENDHOST"
  334.     read HOST
  335.  
  336.     TARGET="client"
  337.  
  338.     if [ "$HOST" = "" ]; then
  339.         echo "Null host name\n"
  340.         exit 0;
  341.     fi;
  342.  
  343.     echo "$NOWECHO"
  344. else
  345.     if [ "$CLASS" = "" ]; then
  346.         echo "Class not supplied !"
  347.         exit 1;
  348.     fi;
  349.     if [ "$TARGET" = "" ]; then
  350.         echo "Missing target !\n"
  351.         exit 1;
  352.     fi;
  353.     if [ "$TARGET" != "share" -a "$HOST" = "" ]; then
  354.         echo "Missing host name\n"
  355.         exit 1;
  356.     fi;
  357. fi
  358.  
  359. . $DIR/$CLASS.dat
  360.  
  361. if [ "$HOST" = "$CLASS" ]; then
  362.     echo HOSTname can not be same as CLASSname
  363.     exit 1;
  364. fi
  365.  
  366. if [ "$DLMAJOR" = "" ]; then
  367.     DLMAJOR=18
  368. fi
  369.  
  370. #
  371. # Validate client name
  372. #
  373. if [ "$HOST" != "" ]; then
  374.     SYSID="$HOST"
  375.     if [ "$NIS" = "yes" ]; then
  376.         ypmatch $HOST hosts > /dev/null 2>&1
  377.         if [ $? = "0" ]; then
  378.             match="`ypmatch $HOST hosts`";
  379.         fi
  380.     else
  381.         match=`grep $HOST /etc/hosts | grep -v \#`
  382.         if [ "$match" != "" ]; then
  383.             set $match
  384.             if [ "`expr $1 : '[1-9][0-9]\{0,2\}\.[0-9]\{1,3\}*'`" != "0" ]; then
  385.                 shift
  386.                 while [ $# -gt 0 ]; do
  387.                     if [ "$1" = "$HOST" ]; then
  388.                         break;
  389.                     fi;
  390.                     shift;
  391.                 done;
  392.             fi
  393.         else
  394.             echo Host name $HOST not found
  395.             exit 1;
  396.         fi;
  397.     fi;
  398.  
  399.     if [ "$match" = "" ]; then
  400.         echo "Invalid host name - $HOST"
  401.         exit 1
  402.     fi
  403.  
  404.     cldir=`dirname "$CLROOT"`
  405.     set $match;
  406.     HOST=$2;
  407.     while [ $# -gt 0 ] ; do
  408.         if [ -d "$cldir/$1" ]; then
  409.             CLROOT=$cldir/$1
  410.             break;
  411.         fi;
  412.         shift;
  413.     done;
  414. fi;
  415.  
  416. SHKEY="$DIR/$CLASS.bpkey"
  417. BPKEY="$CLROOT/bpkey"
  418.  
  419. #
  420. #
  421.  
  422. if [ "$ACTION" = "delete" ]; then
  423.     case "$TARGET" in
  424.     "share")
  425.         poke_host "$CLASS" "$NIS" "$TARGET";
  426.         HOSTSTAT=$?;
  427.         case $HOSTSTAT in
  428.         0)
  429.             echo "Diskless class $CLASS does not exists"
  430.             echo "Action aborted\n";
  431.             exit 1;
  432.             ;;
  433.         1)
  434.             poke_class "${SHAREHOST}:${SHARE}" "$NIS" "$ACTION" "$CLASS";
  435.             HOSTSTAT=$?;
  436.             if [ "$HOSTSTAT" -eq 1 ]; then
  437.                 echo "Action aborted\n";
  438.                 exit 1;
  439.             fi;
  440.             ;;
  441.         *)
  442.             echo "clinst: INTERNAL ERROR $HOSTSTAT"
  443.             exit 1
  444.             ;;
  445.         esac
  446.  
  447.         if [ ! -d $SHARE ]; then
  448.             echo "Share tree not exist"
  449.             exit 1;
  450.         fi;
  451.         echo "About to remove shared tree at $SHARE......"
  452.         echo "Enter confirmation (y/Y)\07 :\c"
  453.         read CONF
  454.         if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  455.             echo "Action aborted\n";
  456.             exit 1;
  457.         fi;
  458.         if [ -f $SHKEY -a "$NIS" = "yes" ]; then
  459.             $NIS_DIR/yp_bootparam -b -d -h $CLASS -k $SHKEY;
  460.             rm $SHKEY;
  461.         elif [ "$NIS" != "yes" -a -f /etc/bootparams ]; then
  462.             sed -e /\^$CLASS\ /d /etc/bootparams > /etc/bootparam
  463.             mv /etc/bootparam /etc/bootparams
  464.         fi;
  465.         unexport_dir $SHARE $CLASS
  466.         rm $BOOTP_DIR/$CLASS
  467.         ;;
  468.     "client")
  469.         poke_host "$HOST" "$NIS" "$TARGET";
  470.         HOSTSTAT=$?;
  471.         case $HOSTSTAT in
  472.         0)
  473.             echo "$HOST is not diskless client for CLASS $CLASS"
  474.             echo "Action aborted\n";
  475.             exit 1;
  476.             ;;
  477.         2)
  478.                 echo "\nWARNING: client $HOST is UP and RUNNING and may CRASH.\n"
  479.             ;;
  480.         *)
  481.             # do nothing
  482.             ;;
  483.         esac
  484.  
  485.         if [ ! -d $CLROOT ]; then
  486.             echo "Client tree not exist"
  487.             exit 1;
  488.         fi;
  489.         echo "Remove client tree at $CLROOT (shared tree = $SHARE)"
  490.         echo "Enter confirmation (y/Y)\07 :\c"
  491.         read CONF
  492.         if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  493.             echo "Action aborted\n";
  494.             exit 1;
  495.         fi;
  496.         if [ -f $BPKEY -a "$NIS" = "yes" ]; then
  497.             $NIS_DIR/yp_bootparam -d -h $HOST -k $BPKEY;
  498.             rm $BPKEY
  499.         elif [ "$NIS" != "yes" -a -f /etc/bootparams ]; then
  500.             sed -e /\^$HOST/d /etc/bootparams > /etc/bootparam
  501.             mv /etc/bootparam /etc/bootparams
  502.         fi;
  503.         unexport_dir $CLROOT $HOST $SWAP
  504.         if [ "$NIS" = "yes" ]; then
  505.             echo "Do you want host $HOST removed from NIS(y/n)?\07 \c"
  506.             read CONF
  507.             if [ "$CONF" = "y" ]; then
  508.                 $NIS_DIR/yp_host -d -h $HOST;
  509.             fi;
  510.         fi
  511.         ;;
  512.     *)
  513.         echo "Unknown  target specified !!"
  514.         ;;
  515.     esac
  516.     exit 0;
  517. fi
  518.  
  519. #
  520. # Install.
  521. #
  522. case "$TARGET" in
  523. "share")
  524.     poke_host "$CLASS" "$NIS" "$TARGET";
  525.     HOSTSTAT=$?;
  526.     case $HOSTSTAT in
  527.     1)
  528.         poke_class "${SHAREHOST}:${SHARE}" "$NIS" "$ACTION" "$CLASS";
  529.         HOSTSTAT=$?;
  530.         if [ "$HOSTSTAT" -eq 1 ]; then
  531.             echo "Action aborted\n";
  532.             exit 1;
  533.         fi;
  534.         ;;
  535.     *)
  536.         # do nothing
  537.     esac
  538.  
  539.     echo "About to install shared tree at $SHARE......"
  540.     echo "Enter confirmation (y/Y)\07:\c"
  541.     read CONF
  542.     if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  543.         echo "Action aborted\n";
  544.         exit 1;
  545.     fi
  546.     if [ "$HOSTNAME" != "$SHAREHOST" ]; then
  547.         echo "Share tree must be built on host $SHAREHOST"
  548.         exit 1;
  549.     fi
  550.  
  551.     if [ "$USESRVROOT" = "yes" ]; then
  552.         echo "Using $SHAREHOST:/ as share-tree $SHARE"
  553.         if [ ! -d $SHARE ]; then
  554.             ln -s / $SHARE;
  555.         else
  556.             chk_sroot $SHARE;
  557.             if [ $? -ne 1 ]; then
  558.                 echo "Remove share tree $CLASS and restart.\n"
  559.                 exit 1;
  560.             fi
  561.         fi
  562.         echo "Is server installed as proto-tree(y/n)? \c"
  563.         read CONF
  564.         if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  565.             echo "When inst invoked, please do following:\n"
  566.             echo "    1. goto manual mode\n"
  567.             echo "    2. set instmode proto\n"
  568.             echo "    3. execute from cmd.\n"
  569.             echo "    4. execute list cmd.\n"
  570.             echo "Ready? \c"
  571.             read CONF
  572.             if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  573.                 echo "Action aborted\n";
  574.                 exit 1;
  575.             fi
  576.             $INST -mGFXBOARD=$GFXBOARD -mCPUBOARD=$CPUBOARD -m$MACH
  577.         fi
  578.     else
  579.         if [ ! -d $SHARE ]; then
  580.             mkdir -p $SHARE;
  581.         fi
  582.         $INST -r$SHARE -mGFXBOARD=$GFXBOARD \
  583.             -mCPUBOARD=$CPUBOARD -m$MACH
  584.         rm -f $SHARE/dev/root
  585.         rm -f $SHARE/dev/swap
  586.         /etc/mknod $SHARE/dev/root b $DLMAJOR 0
  587.         /etc/mknod $SHARE/dev/swap b $DLMAJOR 0
  588.         rm -f $SHARE/usr/sysgen/boot/efs.orig
  589.         $SHARE/usr/sbin/lboot -u $SHARE/unix -r $SHARE \
  590.                     -s $SHARE/usr/sysgen/system.dl
  591.         touch -m 0101000070 $SHARE/unix
  592.     fi
  593.  
  594.     if [ ! -d $BOOTP_DIR ]; then
  595.         mkdir -p $BOOTP_DIR;
  596.     fi
  597.     if [ -l $BOOTP_DIR/$CLASS ]; then
  598.         rm -f $BOOTP_DIR/$CLASS
  599.     fi
  600.     ln -sf $SHARE $BOOTP_DIR/$CLASS
  601.     if [ "$NIS" = "yes" ]; then
  602.         ypcat hosts > $SHARE/etc/hosts;
  603.     else
  604.         if [ "$USESRVROOT" != "yes" ]; then
  605.             cp /etc/hosts $SHARE/etc;
  606.         fi;
  607.     fi;
  608.     export_dir $SHARE ro $CLASS
  609.     if [ "$NIS" = "yes" ]; then
  610.         if [ -f $SHKEY ]; then
  611.             $NIS_DIR/yp_bootparam -d -h $CLASS -b -k $SHKEY;
  612.             rm $SHKEY
  613.         fi
  614.         $NIS_DIR/yp_bootparam -a -h $CLASS -k $SHKEY -b \
  615.             root=$SHAREHOST:$SHARE \
  616.             share=$SHAREHOST: swap=$SHAREHOST:
  617.     else
  618.         sed -e /\^$CLASS\ /d /etc/bootparams > /etc/bootparam
  619.         mv /etc/bootparam /etc/bootparams
  620.         echo "$CLASS root=$SHAREHOST:$SHARE share=$SHAREHOST: swap=$SHAREHOST:" >> /etc/bootparams
  621.     fi;
  622.  
  623.     if [ "$USESRVROOT" != "yes" ]; then
  624.         if [ ! -l $SHARE/etc/init ]; then
  625.             cp $SHARE/etc/init $SHARE/etc/init.bk;
  626.             ln -s cl_init $SHARE/etc/init;
  627.         fi
  628.         rm $SHARE/etc/telinit
  629.         ln -s init.bk $SHARE/etc/telinit
  630.     fi
  631.     ;;
  632.  
  633. "client")
  634.     if [ "$HOST" = "" ]; then
  635.         echo "Host name unspecified\n"
  636.         exit 1;
  637.     fi
  638.     poke_host "$HOST" "$NIS" "$TARGET";
  639.     HOSTSTAT=$?;
  640.     case $HOSTSTAT in
  641.     2)
  642.             echo "\nWARNING: client $HOST is UP and RUNNING and may CRASH.\n"
  643.         ;;
  644.     *)
  645.         # do nothing
  646.         ;;
  647.     esac
  648.  
  649.     echo "\nClient tree = $CLROOT, shared tree = $SHARE"
  650.     if [ `expr "${SHAREHOST}:${CLROOT}" : '.*'` -gt 37 ]; then
  651.         RP="${SHAREHOST}:${CLROOT}"
  652.         echo "WARNING: Client tree($RP) is longer than 37 chars."
  653.     fi;
  654.     if [ "$CMDMODE" = "no" ]; then
  655.         echo "Enter confirmation (y/Y)\07 :\c"
  656.         read CONF
  657.         if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  658.             echo "Action aborted\n";
  659.             exit 1;
  660.         fi
  661.     fi
  662.     if [ ! -d $CLROOT ]; then
  663.         mkdir -p $CLROOT;
  664.     fi
  665.  
  666.     if [ -l /share ]; then
  667.         echo "Warning: Possible multiple diskless client installaton!"
  668.         echo "If there is no other client installation, just type y on prompt."
  669.         echo "Continue?(y/Y)\07 :\c"
  670.         read CONF
  671.         if [ "$CONF" != "y" -a "$CONF" != "Y" ]; then
  672.             echo "Action aborted\n";
  673.             exit 1;
  674.         fi
  675.     fi
  676.  
  677.     export_dir $CLROOT rw $HOST $HOST
  678.     echo "$HOSTNAME:$CLROOT / nfs rw 0 0" > $DIR/fstab.$HOST
  679.     echo "$SHAREHOST:$SHARE /share nfs ro 0 0" >> $DIR/fstab.$HOST
  680.     echo "root=$HOSTNAME:$CLROOT" > $DIR/bootparam.$HOST
  681.     echo "share=$SHAREHOST:$SHARE" >> $DIR/bootparam.$HOST
  682.  
  683.     if [ "$SWAP" = "" -o "$SWAPSIZE" = "0" -o "$SWAPSIZE" = "0k" -o \
  684.         "$SWAPSIZE" = "0b" -o "$SWAPSIZE" = "0m" ]; then
  685.         rm -rf $CLROOT/swap;
  686.         rm -f $SWAP/_swap;
  687.         echo "swap=$HOSTNAME:" >> $DIR/bootparam.$HOST;
  688.     else
  689.         if [ ! -d $CLROOT/swap ]; then
  690.             mkdir -p $CLROOT/swap;
  691.         fi
  692.         echo "$HOSTNAME:$SWAP /swap nfs rw 0 0" >> $DIR/fstab.$HOST
  693.         echo "swap=$HOSTNAME:$SWAP" >> $DIR/bootparam.$HOST;
  694.     
  695.         if [ ! -d $SWAP ]; then
  696.             mkdir -p $SWAP;
  697.         fi;
  698.         if [ ! -f $MKFILE ]; then
  699.             echo "$MKFILE does not exit\n" > /dev/console;
  700.             exit 1;
  701.         fi;
  702.         SWAP_EXIST="no"
  703.         if [ -f $SWAP/_swap ]; then
  704.             set `ls -s $SWAP/_swap`
  705.             SWAP_SZ="` expr $1 / "2048" `m"
  706.             if [ "$SWAP_SZ" = "$SWAPSIZE" ]; then
  707.                 SWAP_EXIST="yes"
  708.             fi;
  709.         fi;
  710.         if [ "$SWAP_EXIST" = "no" ]; then
  711.             echo "Create $SWAPSIZE swap file ........"
  712.             $MKFILE $SWAPSIZE $SWAP/_swap;
  713.         fi;
  714.         export_dir $SWAP rw $HOST $HOST;
  715.     fi;
  716.  
  717.     if [ "$NIS" = "yes" ]; then
  718.         if [ -f $BPKEY ]; then
  719.             $NIS_DIR/yp_bootparam -d -h $HOST -k $BPKEY;
  720.         fi
  721.         $NIS_DIR/yp_bootparam -a -h $HOST -k $BPKEY \
  722.             -f $DIR/bootparam.$HOST
  723.         rm $DIR/bootparam.$HOST
  724.     else
  725.         sed -e /\^$HOST/d /etc/bootparams > /etc/bootparam
  726.         mv /etc/bootparam /etc/bootparams
  727.         set `cat $DIR/bootparam.$HOST`
  728.         echo "$HOST $*" >> /etc/bootparams
  729.     fi;
  730.  
  731.     $INST $MINUSR -r$CLROOT -f$SHARE/usr/lib/inst \
  732.         -mGFXBOARD=$GFXBOARD -mCPUBOARD=$CPUBOARD -m$MACH
  733.     if [ ! -d $CLROOT/share ]; then
  734.         mkdir -p $CLROOT/share;
  735.     fi
  736.  
  737.     cp $DIR/fstab.$HOST $CLROOT/etc/mtab;
  738.     if [ ! -f $CLROOT/etc/fstab ]; then
  739.         mv $DIR/fstab.$HOST $CLROOT/etc/fstab;
  740.     else
  741.         sed -e /\\/\ nfs/d -e /\\/share/d -e /\\/swap/d \
  742.             $CLROOT/etc/fstab > $CLROOT/etc/fstab.tmp;
  743.         mv $DIR/fstab.$HOST $CLROOT/etc/fstab;
  744.         cat $CLROOT/etc/fstab.tmp >> $CLROOT/etc/fstab;
  745.         rm $CLROOT/etc/fstab.tmp
  746.     fi
  747.     if [ ! -d $CLROOT/tmp ]; then
  748.         mkdir -m 777 $CLROOT/tmp;
  749.     fi
  750.     echo on > $CLROOT/etc/config/nfs
  751.     echo on > $CLROOT/etc/config/network
  752.     echo on > $CLROOT/etc/config/verbose
  753.     echo on > $CLROOT/etc/config/timed
  754.     if [ "$NIS" = "yes" ]; then
  755.         ypcat hosts > $CLROOT/etc/hosts;
  756.     else
  757.         cp /etc/hosts $CLROOT/etc
  758.     fi
  759.     rm -f $CLROOT/dev/root
  760.     rm -f $CLROOT/dev/swap
  761.     /etc/mknod $CLROOT/dev/root b $DLMAJOR 0
  762.     /etc/mknod $CLROOT/dev/swap b $DLMAJOR 0
  763.  
  764.     if [ "$USESRVROOT" != "yes" ]; then
  765.         rm -f $CLROOT/etc/init
  766.         rm -f $CLROOT/etc/cl_init
  767.         ln -s /share/etc/init.bk $CLROOT/etc/init
  768.         rm -f $CLROOT/etc/telinit
  769.         ln -s /etc/init $CLROOT/etc/telinit
  770.         rm -f $CLROOT/unix
  771.         ln $SHARE/unix $CLROOT/unix > /dev/null 2>&1
  772.         if [ "$?" != "0" -o "$SHAREHOST" != "$HOSTNAME" ]; then
  773.             rm -f $CLROOT/unix
  774.             if [ "$SHAREHOST" != "$HOSTNAME" ]; then
  775.                 mkdir  $DIR/mount.$HOST
  776.                 mount $SHAREHOST:$SHARE $DIR/mount.$HOST
  777.                 cp $DIR/mount.$HOST/unix $CLROOT/unix
  778.                 umount $DIR/mount.$HOST
  779.                 rm -r $DIR/mount.$HOST
  780.             else
  781.                 cp $SHARE/unix $CLROOT/unix
  782.             fi
  783.         fi
  784.     else
  785.         $SHARE/usr/sbin/lboot -u $CLROOT/unix -r $SHARE \
  786.                     -s $SHARE/usr/sysgen/system.dl
  787.     fi
  788.     touch -m 0101000070 $CLROOT/unix
  789.  
  790.     if [ "$NISDOMAIN" != "" ]; then
  791.         echo $NISDOMAIN > $CLROOT/usr/etc/yp/ypdomain 
  792.     elif [ -x /usr/bin/domainname ]; then
  793.         if [ ! -f $CLROOT/usr/etc/yp/ypdomain ]; then
  794.             /usr/bin/domainname > $CLROOT/usr/etc/yp/ypdomain
  795.         fi
  796.     fi;
  797.  
  798.     rm -f $CLROOT/etc/rc2.d/S48savecore
  799.     if [ "$LOCALDISK" != "yes" ]; then
  800.         rm -f $CLROOT/usr/etc/nfsd
  801.     fi
  802.     echo "$SYSID" > $CLROOT/etc/sys_id
  803.  
  804.     BDNAME=/usr/etc/boot/`basename "$CLROOT"`
  805.     if [ -l "$BDNAME" ]; then
  806.         rm -f "$BDNAME"
  807.     else
  808.         rm -rf "$BDNAME"
  809.     fi
  810.     mkdir "$BDNAME"
  811.     ln -sf "$CLROOT"/unix "$BDNAME"
  812.  
  813.     rm /share >/dev/null 2>&1
  814.     ;;
  815. *)
  816.     echo "No target specified !!"
  817.     exit 0
  818.     ;;
  819. esac
  820.